package cn.ly.design.action.extend;


/**
 * 模板方法模式就是在模板方法中按照一个的  规则  和  顺序  调用基本方法
 * 基本方法可以有具体实现，但是有一些方法是模板定义好的不能改变
 * @author liuyu
 *
 */
public class Template {
	public static void main(String[] args) {
		Hummer1 h = new Hummer1();
		h.run();
	}

}

abstract class HummerModel{
	
	protected abstract void start(); //protected子类都可以继承，不管在不在同一个包，利于率仅次于private和public
	                                 //protected访问权限比default高，利于率比default也高
	protected abstract void stop();
	
	protected abstract void alarm();
	
	public final void run(){//final修饰的方法，子类只能继承，不能修改，体现了模板的固定性
		start();
		alarm();
		stop();
	}
	
}

class Hummer1 extends HummerModel{//因为继承了抽象类 ，所以必须实现抽象方法

	@Override
	public void start() {
		System.out.println("First Hummer start ...");
	}

	@Override
	public void stop() {
		System.out.println("Last Hummer stop.");
	}

	@Override
	public void alarm() {
		System.out.println("Then Hummer alarm!!!");
	}
	
}